首先,我們可以搜尋繼承的 abstractAction
的宣告,
各位也可以自行找到檔案,前後看一下是否有 renderElement()
// addons/web/static/src/js/chrome/abstract_action.js
var AbstractAction = Widget.extend(ActionMixin, {
// ...
});
在 abstractAction
沒有找到 renderElement()
那繼續看 abstractAction
繼承的 ActionMixin
來往上尋找
// addons/web/static/src/js/chrome/action_mixin.js
const ActionMixin = Object.assign({}, WidgetAdapterMixin, {
// ...
renderElement: function () {
this._super.apply(this, arguments);
if (this.contentTemplate) {
const content = core.qweb.render(this.contentTemplate, { widget: this });
this.$('.o_content').append(content);
}
},
// ...
});
有沒有發現關鍵字 this.contentTemplate
跳到對應的屬性,可以看到 Action 預設有一個 template Action
,並額外定義一個屬性 contentTemplate
// addons/web/static/src/js/chrome/action_mixin.js
const ActionMixin = Object.assign({}, WidgetAdapterMixin, {
template: 'Action',
/**
* The action mixin assumes that it is rendered with the 'Action' template.
* This template has a special zone ('.o_content') where the content should
* be added. Actions that want to automatically render a template there
* should define the contentTemplate key. In short, client actions should
* probably define a contentTemplate key, and not a template key.
*/
contentTemplate: null,
// ...
});
而註解也解釋了為什麼要這麼做
(TOEIC 87分翻譯,請多多包涵與指教)
The action mixin assumes that it is rendered with the 'Action' template.
-> Action mixin 已經預設渲染模板 'Action'
This template has a special zone ('.o_content') where the content should be added.
-> 這個模板有定義特別的區域 ('.o_content'),額外定義內容會加入在這個區域以內
Actions that want to automatically render a template there should define the contentTemplate key.
-> Actions 會自動渲染 template 的定義,所以若需要自定義模板,則需要定義 'contentTemplate' 屬性
In short, client actions should probably define a contentTemplate key, and not a template key.
-> 簡單來說,Client actions 若需要自定義模板,則定義在 'contentTemplate' 屬性,而不是 'template' 屬性
所以就能清楚 client action view 跟 field widget 的在模板套用上的差異
當然也可以直接覆蓋 template
跟 renderElement()
自己寫一套流程
但就看各位接到需求了